Micron Document
🌎 rns.kin.earth git 🌍

Node / dev / reticulum / files / RNS / Utilities / rnstatus.py

Displaying Raw • Download

RNS/Utilities/rnstatus.py 9d924dcd6d7d07bbcbf3d2d083a007d2f49a2afb (9d924dcd) Text, 21.79 KB

T8b949e#!/usr/bin/env python3

T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2022 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787argparse

Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__

Tff7b72def Td2a8ffsize_strTb4b4b4(Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72*Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.0fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0

Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)

Te6edf3request_result Tff7b72= Tff7b72None
Te6edf3request_concluded Tff7b72= Tff7b72False
Tff7b72def Td2a8ffget_remote_statusTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3include_lstatsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3no_outputTff7b72=Tff7b72FalseTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3request_resultTb4b4b4, Te6edf3request_concluded
Te6edf3link_count Tff7b72= Tff7b72None

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requestedTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3pr_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3pr_time Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath request timed outTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff12Tb4b4b4)

Te6edf3remote_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)

Tff7b72def Td2a8ffremote_link_closedTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffteardown_reason Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffTIMEOUTTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe link timed out, exiting nowTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3linkTff7b72.Td2a8ffteardown_reason Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffDESTINATION_CLOSEDTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe link was closed by the server, exiting nowTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink closed unexpectedly, exiting nowTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff10Tb4b4b4)

Tff7b72def Td2a8ffrequest_failedTb4b4b4(Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3request_resultTb4b4b4, Te6edf3request_concluded
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe remote status request failed. Likely authentication failure.Ta5d6ff"Tb4b4b4)
Te6edf3request_concluded Tff7b72= Tff7b72True

Tff7b72def Td2a8ffgot_responseTb4b4b4(Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3request_resultTb4b4b4, Te6edf3request_concluded
Te6edf3response Tff7b72= Te6edf3request_receiptTff7b72.Td2a8ffresponse
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3responseTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3status Tff7b72= Te6edf3responseTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3responseTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3link_count Tff7b72= Te6edf3responseTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3link_count Tff7b72= Tff7b72None

Te6edf3request_result Tff7b72= Tb4b4b4(Te6edf3statusTb4b4b4, Te6edf3link_countTb4b4b4)

Te6edf3request_concluded Tff7b72= Tff7b72True

Tff7b72def Td2a8ffremote_link_establishedTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending request...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6ff/statusTa5d6ff"Tb4b4b4, Te6edf3data Tff7b72= Tb4b4b4[Te6edf3include_lstatsTb4b4b4]Tb4b4b4, Te6edf3response_callback Tff7b72= Te6edf3got_responseTb4b4b4, Te6edf3failed_callback Tff7b72= Te6edf3request_failedTb4b4b4)

Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link with remote transport instance...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Te6edf3remote_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmanagementTa5d6ff"Tb4b4b4)
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3remote_destinationTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Te6edf3remote_link_establishedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_closed_callbackTb4b4b4(Te6edf3remote_link_closedTb4b4b4)

Tff7b72while Tff7b72not Te6edf3request_concludedTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)

Tff7b72if Te6edf3request_result Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72return Te6edf3request_result

Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3dispallTff7b72=Tff7b72FalseTb4b4b4, Te6edf3verbosityTff7b72=T79c0ff0Tb4b4b4, Te6edf3name_filterTff7b72=Tff7b72NoneTb4b4b4, Te6edf3jsonTff7b72=Tff7b72FalseTb4b4b4, Te6edf3astatsTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3lstatsTff7b72=Tff7b72FalseTb4b4b4, Te6edf3sortingTff7b72=Tff7b72NoneTb4b4b4, Te6edf3sort_reverseTff7b72=Tff7b72FalseTb4b4b4, Te6edf3remoteTff7b72=Tff7b72NoneTb4b4b4, Te6edf3management_identityTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3remote_timeoutTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4, Te6edf3must_exitTff7b72=Tff7b72TrueTb4b4b4, Te6edf3rns_instanceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3remoteTb4b4b4:
Te6edf3require_shared Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3require_shared Tff7b72= Tff7b72True

Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3rns_instanceTb4b4b4:
Te6edf3reticulum Tff7b72= Te6edf3rns_instance
Te6edf3must_exit Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3configdirTb4b4b4, Te6edf3loglevelTff7b72=T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4, Te6edf3require_shared_instanceTff7b72=Te6edf3require_sharedTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo shared RNS instance available to get status fromTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3must_exitTb4b4b4:
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return

Te6edf3link_count Tff7b72= Tff7b72None
Te6edf3stats Tff7b72= Tff7b72None
Tff7b72if Te6edf3remoteTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3remoteTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3remoteTb4b4b4)
Te6edf3destination_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffrnstransport.remote.managementTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)

Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3management_identityTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCould not load management identity from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3management_identityTb4b4b4)Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3remote_status Tff7b72= Te6edf3get_remote_statusTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3lstatsTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3no_outputTff7b72=Te6edf3jsonTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3remote_timeoutTb4b4b4)
Tff7b72if Te6edf3remote_status Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3statsTb4b4b4, Te6edf3link_count Tff7b72= Te6edf3remote_status
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Te6edf3e
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3must_exitTb4b4b4:
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return

Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3lstatsTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3link_count Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_link_countTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72pass

Tff7b72tryTb4b4b4:
Te6edf3stats Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_interface_statsTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72pass

Tff7b72if Te6edf3stats Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3jsonTb4b4b4:
Tff7b72import T7ee787json
Tff7b72for Te6edf3s Tff7b72in Te6edf3statsTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3statsTb4b4b4[Te6edf3sTb4b4b4]Tb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3statsTb4b4b4[Te6edf3sTb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3statsTb4b4b4[Te6edf3sTb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3statsTb4b4b4[Te6edf3sTb4b4b4]Tb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Tffa657isinstanceTb4b4b4(Te6edf3statsTb4b4b4[Te6edf3sTb4b4b4]Tb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Te6edf3statsTb4b4b4[Te6edf3sTb4b4b4]Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3iTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3k Tff7b72in Te6edf3iTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3iTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3iTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3iTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)

Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3statsTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3must_exitTb4b4b4:
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return

Te6edf3interfaces Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3sorting Tff7b72!= Tff7b72None Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3sortingTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3sorting Tff7b72= Te6edf3sortingTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffrateTa5d6ff" Tff7b72or Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffrxTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6fftxTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6fftrafficTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4]Tff7b72+Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffannouncesTa5d6ff" Tff7b72or Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffincoming_announce_frequencyTa5d6ff"Tb4b4b4]Tff7b72+Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffoutgoing_announce_frequencyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffarxTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffincoming_announce_frequencyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffatxTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffoutgoing_announce_frequencyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)
Tff7b72if Te6edf3sorting Tff7b72== Ta5d6ff"Ta5d6ffheldTa5d6ff"Tb4b4b4:
Te6edf3interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3iTb4b4b4[Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72not Te6edf3sort_reverseTb4b4b4)

Tff7b72for Te6edf3ifstat Tff7b72in Te6edf3interfacesTb4b4b4:
Te6edf3name Tff7b72= Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]

Tff7b72if Te6edf3dispall Tff7b72or Tff7b72not Tb4b4b4(
Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffLocalInterface[Ta5d6ff"Tb4b4b4) Tff7b72or
Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffTCPInterface[ClientTa5d6ff"Tb4b4b4) Tff7b72or
Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffI2PInterfacePeer[Connected peerTa5d6ff"Tb4b4b4) Tff7b72or
Tb4b4b4(Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffI2PInterface[Ta5d6ff"Tb4b4b4) Tff7b72and Tb4b4b4(Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4)Tb4b4b4)
Tb4b4b4)Tb4b4b4:

Tff7b72if Tff7b72not Tb4b4b4(Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffI2PInterface[Ta5d6ff"Tb4b4b4) Tff7b72and Tb4b4b4(Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name_filter Tff7b72== Tff7b72None Tff7b72or Te6edf3name_filterTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72in Te6edf3nameTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3ss Tff7b72= Ta5d6ff"Ta5d6ffUpTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ss Tff7b72= Ta5d6ff"Ta5d6ffDownTa5d6ff"

Tff7b72if Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINTTb4b4b4:
Te6edf3modestr Tff7b72= Ta5d6ff"Ta5d6ffAccess PointTa5d6ff"
Tff7b72elif Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_POINT_TO_POINTTb4b4b4:
Te6edf3modestr Tff7b72= Ta5d6ff"Ta5d6ffPoint-to-PointTa5d6ff"
Tff7b72elif Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMINGTb4b4b4:
Te6edf3modestr Tff7b72= Ta5d6ff"Ta5d6ffRoamingTa5d6ff"
Tff7b72elif Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARYTb4b4b4:
Te6edf3modestr Tff7b72= Ta5d6ff"Ta5d6ffBoundaryTa5d6ff"
Tff7b72elif Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_GATEWAYTb4b4b4:
Te6edf3modestr Tff7b72= Ta5d6ff"Ta5d6ffGatewayTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3modestr Tff7b72= Ta5d6ff"Ta5d6ffFullTa5d6ff"


Tff7b72if Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3clients Tff7b72= Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffShared Instance[Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3cnum Tff7b72= Tffa657maxTb4b4b4(Te6edf3clientsTff7b72-T79c0ff1Tb4b4b4,T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3cnum Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3spec_str Tff7b72= Ta5d6ff"Ta5d6ff programTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3spec_str Tff7b72= Ta5d6ff"Ta5d6ff programsTa5d6ff"

Te6edf3clients_string Tff7b72= Ta5d6ff"Ta5d6ffServing : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3cnumTb4b4b4)Tff7b72+Te6edf3spec_str
Tff7b72elif Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffI2PInterface[Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3cnum Tff7b72= Te6edf3clients
Tff7b72if Te6edf3cnum Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3spec_str Tff7b72= Ta5d6ff"Ta5d6ff connected I2P endpointTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3spec_str Tff7b72= Ta5d6ff"Ta5d6ff connected I2P endpointsTa5d6ff"

Te6edf3clients_string Tff7b72= Ta5d6ff"Ta5d6ffPeers : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3cnumTb4b4b4)Tff7b72+Te6edf3spec_str
Tff7b72elseTb4b4b4:
Te6edf3clients_string Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3clients_string Tff7b72= Ta5d6ff"Ta5d6ffClients : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3clientsTb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3clients Tff7b72= Tff7b72None

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Tffd700{n}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3nTff7b72=Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Network : Tffd700{nn}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3nnTff7b72=Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Status : Tffd700{ss}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3ssTff7b72=Te6edf3ssTb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3clients Tff7b72!= Tff7b72None Tff7b72and Te6edf3clients_string Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3clients_stringTb4b4b4)

Tff7b72if Tff7b72not Tb4b4b4(Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffShared Instance[Ta5d6ff"Tb4b4b4) Tff7b72or Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffTCPInterface[ClientTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffLocalInterface[Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Mode : Tffd700{mode}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3modeTff7b72=Te6edf3modestrTb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffbitrateTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Rate : Tffd700{ss}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3ssTff7b72=Te6edf3speed_strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffbattery_percentTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffbattery_percentTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3bpi Tff7b72= Tffa657intTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffbattery_percentTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3bss Tff7b72= Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffbattery_stateTa5d6ff"Tb4b4b4]
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Battery : Tffd700{Te6edf3bpiTffd700}Ta5d6ff% (Tffd700{Te6edf3bssTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass

Tff7b72if Ta5d6ff"Ta5d6ffairtime_shortTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Ta5d6ff"Ta5d6ffairtime_longTa5d6ff" Tff7b72in Te6edf3ifstatTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Airtime : Tffd700{ats}Ta5d6ff%Ta5d6ff (15s), Tffd700{atl}Ta5d6ff%Ta5d6ff (1h)Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3atsTff7b72=Tffa657strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffairtime_shortTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,Te6edf3atlTff7b72=Tffa657strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffairtime_longTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffchannel_load_shortTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Ta5d6ff"Ta5d6ffchannel_load_longTa5d6ff" Tff7b72in Te6edf3ifstatTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Ch.Load : Tffd700{ats}Ta5d6ff%Ta5d6ff (15s), Tffd700{atl}Ta5d6ff%Ta5d6ff (1h)Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3atsTff7b72=Tffa657strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffchannel_load_shortTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,Te6edf3atlTff7b72=Tffa657strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffchannel_load_longTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffpeersTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Peers : Tffd700{np}Ta5d6ff reachableTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3npTff7b72=Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6fftunnelstateTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6fftunnelstateTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff I2P : Tffd700{ts}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3tsTff7b72=Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6fftunnelstateTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffifac_signatureTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffifac_signatureTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3sigstr Tff7b72= Ta5d6ff"Ta5d6ff<…Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffifac_signatureTa5d6ff"Tb4b4b4]Tb4b4b4[Tff7b72-T79c0ff5Tb4b4b4:Tb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Access : Tffd700{nb}Ta5d6ff-bit IFAC by Tffd700{sig}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3nbTff7b72=Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff"Tb4b4b4]Tff7b72*T79c0ff8Tb4b4b4, Te6edf3sigTff7b72=Te6edf3sigstrTb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffi2p_b32Ta5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffi2p_b32Ta5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff I2P B32 : Tffd700{ep}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3epTff7b72=Tffa657strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffi2p_b32Ta5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3astats Tff7b72and Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3aqn Tff7b72= Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3aqn Tff7b72== T79c0ff1Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Queued : Tffd700{np}Ta5d6ff announceTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3npTff7b72=Te6edf3aqnTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Queued : Tffd700{np}Ta5d6ff announcesTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3npTff7b72=Te6edf3aqnTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3astats Tff7b72and Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3aqn Tff7b72= Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3aqn Tff7b72== T79c0ff1Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Held : Tffd700{np}Ta5d6ff announceTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3npTff7b72=Te6edf3aqnTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Held : Tffd700{np}Ta5d6ff announcesTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3npTff7b72=Te6edf3aqnTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3astats Tff7b72and Ta5d6ff"Ta5d6ffincoming_announce_frequencyTa5d6ff" Tff7b72in Te6edf3ifstat Tff7b72and Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffincoming_announce_frequencyTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Announces : Tffd700{iaf}Ta5d6ff↑Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3iafTff7b72=Te6edf3RNSTff7b72.Td2a8ffprettyfrequencyTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffoutgoing_announce_frequencyTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Tffd700{iaf}Ta5d6ff↓Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3iafTff7b72=Te6edf3RNSTff7b72.Td2a8ffprettyfrequencyTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffincoming_announce_frequencyTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Traffic : Tffd700{txb}Ta5d6ff↑Tffea00\nTa5d6ff Tffd700{rxb}Ta5d6ff↓Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3rxbTff7b72=Te6edf3size_strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3txbTff7b72=Te6edf3size_strTb4b4b4(Te6edf3ifstatTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)

Te6edf3lstr Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3link_count Tff7b72!= Tff7b72None Tff7b72and Te6edf3lstatsTb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ffyTa5d6ff" Tff7b72if Te6edf3link_count Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffiesTa5d6ff"
Tff7b72if Ta5d6ff"Ta5d6fftransport_idTa5d6ff" Tff7b72in Te6edf3stats Tff7b72and Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3lstr Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff, Tffd700{Te6edf3link_countTffd700}Ta5d6ff entrTffd700{Te6edf3msTffd700}Ta5d6ff in link tableTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3lstr Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3link_countTffd700}Ta5d6ff entrTffd700{Te6edf3msTffd700}Ta5d6ff in link tableTa5d6ff"

Tff7b72if Ta5d6ff"Ta5d6fftransport_idTa5d6ff" Tff7b72in Te6edf3stats Tff7b72and Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff Transport Instance Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff runningTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffprobe_responderTa5d6ff" Tff7b72in Te6edf3stats Tff7b72and Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffprobe_responderTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Probe responder at Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffprobe_responderTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+ Ta5d6ff"Ta5d6ff activeTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6fftransport_uptimeTa5d6ff" Tff7b72in Te6edf3stats Tff7b72and Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_uptimeTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff Uptime is Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_uptimeTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Te6edf3lstrTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3lstr Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3lstrTffd700}Ta5d6ff"Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3remoteTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not get RNS statusTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not get RNS status from remote transport instance Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3must_exitTb4b4b4:
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return

Tff7b72def Td2a8ffmainTb4b4b4(Te6edf3must_exitTff7b72=Tff7b72TrueTb4b4b4, Te6edf3rns_instanceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Network Stack StatusTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnstatus Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)

Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-aTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--allTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow all interfacesTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-ATa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--announce-statsTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow announce statsTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-lTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--link-statsTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow link statsTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--sortTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffsort interfaces by [rate, traffic, rx, tx, announces, arx, atx, held]Ta5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--reverseTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffreverse sortingTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-jTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--jsonTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffoutput in JSON formatTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)

Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-RTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftransport identity hash of remote instance to get status fromTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)

Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to identity used for remote managementTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)

Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657floatTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftimeout before giving up on remote queriesTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUT
Tb4b4b4)

Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--verboseTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)

Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6fffilterTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffonly display interfaces with names including filterTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3configarg Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfig
Tff7b72elseTb4b4b4:
Te6edf3configarg Tff7b72= Tff7b72None

Te6edf3program_setupTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3configargTb4b4b4,
Te6edf3dispall Tff7b72= Te6edf3argsTff7b72.Td2a8ffallTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3name_filterTff7b72=Te6edf3argsTff7b72.Td2a8fffilterTb4b4b4,
Te6edf3jsonTff7b72=Te6edf3argsTff7b72.Td2a8ffjsonTb4b4b4,
Te6edf3astatsTff7b72=Te6edf3argsTff7b72.Td2a8ffannounce_statsTb4b4b4,
Te6edf3lstatsTff7b72=Te6edf3argsTff7b72.Td2a8fflink_statsTb4b4b4,
Te6edf3sortingTff7b72=Te6edf3argsTff7b72.Td2a8ffsortTb4b4b4,
Te6edf3sort_reverseTff7b72=Te6edf3argsTff7b72.Td2a8ffreverseTb4b4b4,
Te6edf3remoteTff7b72=Te6edf3argsTff7b72.Td2a8ffRTb4b4b4,
Te6edf3management_identityTff7b72=Te6edf3argsTff7b72.Td2a8ffiTb4b4b4,
Te6edf3remote_timeoutTff7b72=Te6edf3argsTff7b72.Td2a8ffwTb4b4b4,
Te6edf3must_exitTff7b72=Te6edf3must_exitTb4b4b4,
Te6edf3rns_instanceTff7b72=Te6edf3rns_instanceTb4b4b4,
Tb4b4b4)

Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3must_exitTb4b4b4:
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return

Tff7b72def Td2a8ffspeed_strTb4b4b4(Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffbpsTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffkTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffBpsTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72/Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%3.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0

Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)

Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)

Served by rngit 1.5.2 - Generated in 0.21s